﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace CaptchaLearning.Infrastructure.Model
{
    /// <summary>
    /// Mỗi một character có một HMM riêng
    /// </summary>
    /// 
    [DataContract(Name = "Character", Namespace = "CaptchaLearning.Infrastructure.Model")]
    public class Character
    {
        /// <summary>
        /// Id phục vụ cho việc tìm kiếm ký tự trong danh sách
        /// </summary>
        [DataMember]
        public Guid Id { get; set; }

        /// <summary>
        /// Là ký tự trong bảng chữ cái
        /// </summary>
        [DataMember]
        public string Name { get; set; }

        /// <summary>
        /// Danh sách trạng thái quan ẩn của hmm theo lef-to-right
        /// </summary>
        [DataMember]
        public ObservableCollection<ImageColumn> States { get; set; }

        /// <summary>
        /// Chuỗi trạng thái quan sát
        /// </summary>
        public ObservableCollection<ImageColumn> Observations { get; set; }

        /// <summary>
        /// Ma trận chuyển xác suất giữa các trạng thái ẩn
        /// </summary>
        [DataMember]
        public TransitionMatrix TransitionMatrix { get; set; }

        /// <summary>
        /// Ma trận emission để tính likelihood
        /// </summary>
        [DataMember]
        public EmissionMatrix EmissionMatrix { get; set; }

        /// <summary>
        /// Chuỗi Pi tương ứng cho xác suất khởi đầu của mỗi trạng thái ẩn
        /// </summary>
        public ObservableCollection<double> Pi { get; set; }

        public Character()
        {
            this.Id = Guid.NewGuid();
            this.Name = string.Empty;
            this.States = new ObservableCollection<ImageColumn>();
            this.Observations = new ObservableCollection<ImageColumn>();
            this.TransitionMatrix = new TransitionMatrix();
            this.EmissionMatrix = new EmissionMatrix();
            this.Pi = new ObservableCollection<double>();
        }

    }
}
